﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using SCO.BE;
using SCO.DAO.Interfaces;
using System.Configuration;
namespace SCO.DAO.SqlDataAdapter
{
    public class CitaDAO : ICitaDAO
    {

        string cadenaConexion = string.Empty;
        public CitaDAO()
        {
            this.cadenaConexion = ConfigurationManager.ConnectionStrings["CNX"].ConnectionString.ToString();
        }

        public citaBE registrar(citaBE objeto, ref string mensajeRespuesta, ref string tipoMensaje)
        {
            try
            {
                using (SqlConnection oCn = new SqlConnection(this.cadenaConexion))
                {
                    using (SqlCommand oCmd = new SqlCommand("USP_GENERAR_CITA", oCn))
                    {
                        oCmd.Parameters.Add("@NOMPAC", SqlDbType.VarChar, 50).Value = objeto.NOMPAC;
                        oCmd.Parameters.Add("@APEPPAC", SqlDbType.VarChar, 50).Value = objeto.APEPPAC;
                        oCmd.Parameters.Add("@APEMPAC", SqlDbType.VarChar, 50).Value = objeto.APEMPAC;
                        oCmd.Parameters.Add("@DNIPAC", SqlDbType.VarChar, 20).Value = objeto.DNIPAC;
                        oCmd.Parameters.Add("@FECNACPAC", SqlDbType.VarChar, 20).Value = objeto.FECNACPAC;
                        oCmd.Parameters.Add("@TELCPAC", SqlDbType.VarChar, 20).Value = objeto.TELCPAC;
                        oCmd.Parameters.Add("@TELHPAC", SqlDbType.VarChar, 20).Value = objeto.TELHPAC;
                        oCmd.Parameters.Add("@CORPAC", SqlDbType.VarChar, 50).Value = objeto.CORPAC;
                        oCmd.Parameters.Add("@DIRPAC", SqlDbType.VarChar, 200).Value = objeto.DIRPAC;
                        oCmd.Parameters.Add("@CODDIS", SqlDbType.Int, 0).Value = objeto.CODDIS;
                        oCmd.Parameters.Add("@SEXPAC", SqlDbType.VarChar, 1).Value = objeto.SEXPAC;


                        oCmd.Parameters.Add("@FECCITA", SqlDbType.VarChar, 20).Value = objeto.FECCITA;
                        oCmd.Parameters.Add("@CODHOR", SqlDbType.Int, 0).Value = objeto.CODHOR;
                        //oCmd.Parameters.Add("@CODPAC", SqlDbType.Int, 0).Value = objeto.TELHPAC;
                        oCmd.Parameters.Add("@CODEMP", SqlDbType.Int, 0).Value = objeto.CODEMP;
                        oCmd.Parameters.Add("@CODOCU", SqlDbType.Int, 0).Value = objeto.CODOCU;
                        oCmd.Parameters.Add("@MANALI", SqlDbType.VarChar, 1).Value = objeto.MANALI;
                        oCmd.Parameters.Add("@NUMDOCPAG", SqlDbType.VarChar, 20).Value = objeto.NUMDOCPAG;
                        oCmd.Parameters.Add("@MONPAG", SqlDbType.VarChar, 20).Value = objeto.MONPAG;
                        oCmd.Parameters.Add("@TIPPAG", SqlDbType.VarChar, 1).Value = objeto.TIPPAG;
                        oCmd.Parameters.Add("@MENSAJE", SqlDbType.VarChar, 200).Direction = ParameterDirection.Output;
                        oCmd.Parameters.Add("@TIPOMENSAJE", SqlDbType.VarChar, 1).Direction = ParameterDirection.Output;
                        oCmd.Parameters.Add("@CODCITA", SqlDbType.Int, 0).Direction = ParameterDirection.Output;
                       
                        oCmd.CommandType = CommandType.StoredProcedure;
                        oCmd.Connection = oCn;
                        oCn.Open();
                        oCmd.ExecuteNonQuery();
                        mensajeRespuesta = oCmd.Parameters["@MENSAJE"].Value.ToString();
                        tipoMensaje = oCmd.Parameters["@TIPOMENSAJE"].Value.ToString();
                        objeto.CODCIT = Convert.ToInt32(oCmd.Parameters["@CODCITA"].Value.ToString());
                        return objeto;
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }

        public citaBE actualizar(citaBE objeto, ref string mensajeRespuesta, ref string tipoMensaje)
        {
            throw new NotImplementedException();
        }

        public citaBE eliminar(citaBE objeto, ref string mensajeRespuesta, ref string tipoMensaje)
        {
            throw new NotImplementedException();
        }

        public citaBE buscar(citaBE objeto)
        {
            try
            {
                using (SqlConnection oCn = new SqlConnection(this.cadenaConexion))
                {
                    using (SqlCommand oCmd = new SqlCommand("USP_BUSCAR_CITA_COMPROBANTE", oCn))
                    {
                        oCmd.Parameters.Add("@NUMDOCPAG", SqlDbType.VarChar, 20).Value = objeto.NUMDOCPAG;
                        oCmd.Parameters.Add("@TIPPAG", SqlDbType.VarChar, 2).Value = objeto.TIPPAG;
                        oCmd.CommandType = CommandType.StoredProcedure;
                        oCmd.Connection = oCn;
                        oCn.Open();
                        SqlDataReader reader = oCmd.ExecuteReader();
                        if (reader.HasRows)
                        {

                            reader.Read();
                            //objeto = new citaBE();
                            objeto.CODCIT = reader.GetInt32(reader.GetOrdinal("CODCIT"));
                            objeto.NOMPAC = reader.GetString(reader.GetOrdinal("NOMPAC"));
                            objeto.APEPPAC = reader.GetString(reader.GetOrdinal("APEPPAC"));
                            objeto.APEMPAC = reader.GetString(reader.GetOrdinal("APEMPAC"));
                            objeto.DNIPAC = reader.GetString(reader.GetOrdinal("DNIPAC"));
                            objeto.CORPAC = reader.GetString(reader.GetOrdinal("CORPAC"));
                            objeto.NOMEMP = reader.GetString(reader.GetOrdinal("NOMEMP"));
                            objeto.NOMOCU = reader.GetString(reader.GetOrdinal("NOMOCU"));
                            objeto.FECCITA = reader.GetString(reader.GetOrdinal("FECCITA"));
                            objeto.DESHOR = reader.GetString(reader.GetOrdinal("DESHOR"));
                            objeto.FLGEST = reader.GetString(reader.GetOrdinal("FLGEST"));
                            return objeto;
                        }
                        else
                        {
                            return null;
                        }
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }

        public List<citaBE> listarGeneral()
        {
            throw new NotImplementedException();
        }

        public List<citaBE> listarPaginado(citaBE objeto, int index, int registros, ref int totalPaginas)
        {
            List<citaBE> lista = new List<citaBE>();
            citaBE cita;
            try
            {
                using (SqlConnection oCn = new SqlConnection(this.cadenaConexion))
                {
                    using (SqlCommand oCmd = new SqlCommand("USP_LISTAR_CITAS_ESTADO", oCn))
                    {
                        oCmd.Parameters.Add("@FLGEST", SqlDbType.VarChar, 1).Value = objeto.FLGEST;
                        oCmd.Parameters.Add("@NUMREG", SqlDbType.Int, 0).Value = registros;
                        oCmd.Parameters.Add("@INDEX", SqlDbType.Int, 0).Value = index;
                        oCmd.Parameters.Add("@TOTPAG", SqlDbType.Int, 0).Direction = ParameterDirection.Output;
                        oCmd.CommandType = CommandType.StoredProcedure;
                        oCmd.Connection = oCn;
                        oCn.Open();
                        SqlDataReader reader = oCmd.ExecuteReader();
                        if (reader.HasRows)
                        {

                           while(reader.Read()){
                               cita = new citaBE();
                               cita.CODCIT = reader.GetInt32(reader.GetOrdinal("CODCIT"));
                               cita.MANALI = reader.GetString(reader.GetOrdinal("MANALI"));
                               cita.NOMPAC = reader.GetString(reader.GetOrdinal("NOMPAC"));
                               cita.APEPPAC = reader.GetString(reader.GetOrdinal("APEPPAC"));
                               cita.APEMPAC = reader.GetString(reader.GetOrdinal("APEMPAC"));
                               cita.DNIPAC = reader.GetString(reader.GetOrdinal("DNIPAC"));
                               cita.FECNACPAC = reader.GetString(reader.GetOrdinal("FECNACPAC"));
                               cita.CORPAC = reader.GetString(reader.GetOrdinal("CORPAC"));
                               cita.TELCPAC = reader.GetString(reader.GetOrdinal("TELCPAC"));
                               cita.TELHPAC = reader.GetString(reader.GetOrdinal("TELHPAC"));
                               cita.SEXPAC = reader.GetString(reader.GetOrdinal("SEXPAC"));
                               cita.FECCITA = reader.GetString(reader.GetOrdinal("FECCITA"));
                               cita.DESHOR = reader.GetString(reader.GetOrdinal("DESHOR"));
                               cita.OBSCIT = reader.GetString(reader.GetOrdinal("OBSCIT"));
                               cita.FLGDEL = reader.GetString(reader.GetOrdinal("FLGDEL"));
                               lista.Add(cita);
                           }
                            return lista;
                        }
                        else
                        {
                            return null;
                        }
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }


        public citaBE buscarId(int Id)
        {
            citaBE objeto;
            
            try
            {
                using (SqlConnection oCn = new SqlConnection(this.cadenaConexion))
                {
                    using (SqlCommand oCmd = new SqlCommand("USP_BUSCAR_CITA_ID", oCn))
                    {
                        oCmd.Parameters.Add("@CODCITA", SqlDbType.Int, 0).Value = Id;
                        oCmd.CommandType = CommandType.StoredProcedure;
                        oCmd.Connection = oCn;
                        oCn.Open();
                        SqlDataReader reader = oCmd.ExecuteReader();
                        if (reader.HasRows)
                        {

                            reader.Read();
                            objeto = new citaBE();
                            objeto.NOMPAC = reader.GetString(reader.GetOrdinal("NOMPAC"));
                            objeto.APEPPAC = reader.GetString(reader.GetOrdinal("APEPPAC"));
                            objeto.APEMPAC = reader.GetString(reader.GetOrdinal("APEMPAC"));
                            objeto.DNIPAC = reader.GetString(reader.GetOrdinal("DNIPAC"));
                            objeto.FECNACPAC = reader.GetString(reader.GetOrdinal("FECNACPAC"));
                            objeto.CORPAC = reader.GetString(reader.GetOrdinal("CORPAC"));
                            objeto.TELCPAC = reader.GetString(reader.GetOrdinal("TELCPAC"));
                            objeto.TELHPAC = reader.GetString(reader.GetOrdinal("TELHPAC"));
                            objeto.SEXPAC = reader.GetString(reader.GetOrdinal("SEXPAC"));
                            objeto.FECCITA = reader.GetString(reader.GetOrdinal("FECCITA"));
                            objeto.DESHOR = reader.GetString(reader.GetOrdinal("DESHOR"));
                            return objeto;
                        }
                        else
                        {
                            return null;
                        }
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }

        public citaBE reprogramarCita(citaBE objeto, ref string mensajeRespuesta, ref string tipoMensaje)
        {
            try
            {
                using (SqlConnection oCn = new SqlConnection(this.cadenaConexion))
                {
                    using (SqlCommand oCmd = new SqlCommand("USP_REPROGRAMAR_CITA", oCn))
                    {
                        oCmd.Parameters.Add("@CODCIT", SqlDbType.VarChar, 50).Value = objeto.CODCIT;
                        oCmd.Parameters.Add("@CODHOR", SqlDbType.VarChar, 50).Value = objeto.CODHOR;
                        oCmd.Parameters.Add("@FECCITA", SqlDbType.VarChar, 50).Value = objeto.FECCITA;
                        oCmd.Parameters.Add("@MENSAJE", SqlDbType.VarChar, 200).Direction = ParameterDirection.Output;
                        oCmd.Parameters.Add("@TIPOMENSAJE", SqlDbType.VarChar, 1).Direction = ParameterDirection.Output;
                        oCmd.CommandType = CommandType.StoredProcedure;
                        oCmd.Connection = oCn;
                        oCn.Open();
                        oCmd.ExecuteNonQuery();
                        mensajeRespuesta = oCmd.Parameters["@MENSAJE"].Value.ToString();
                        tipoMensaje = oCmd.Parameters["@TIPOMENSAJE"].Value.ToString();
                        return objeto;
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }


        public citaBE atenderCita(citaBE objeto, ref string mensajeRespuesta, ref string tipoMensaje)
        {
            try
            {
                using (SqlConnection oCn = new SqlConnection(this.cadenaConexion))
                {
                    using (SqlCommand oCmd = new SqlCommand("USP_ATENDER_CITA", oCn))
                    {
                        oCmd.Parameters.Add("@CODCIT", SqlDbType.Int, 0).Value = objeto.CODCIT;
                        oCmd.Parameters.Add("@CODLAB", SqlDbType.Int, 0).Value = objeto.CODLAB;
                        oCmd.Parameters.Add("@CODDOC", SqlDbType.Int, 0).Value = objeto.CODDOC;
                        oCmd.Parameters.Add("@OBSCIT", SqlDbType.VarChar, 800).Value = objeto.OBSCIT;
                        oCmd.Parameters.Add("@FLGEST", SqlDbType.VarChar, 1).Value = objeto.FLGEST;
                        
                        oCmd.Parameters.Add("@MENSAJE", SqlDbType.VarChar, 200).Direction = ParameterDirection.Output;
                        oCmd.Parameters.Add("@TIPOMENSAJE", SqlDbType.VarChar, 1).Direction = ParameterDirection.Output;
                        oCmd.CommandType = CommandType.StoredProcedure;
                        oCmd.Connection = oCn;
                        oCn.Open();
                        oCmd.ExecuteNonQuery();
                        mensajeRespuesta = oCmd.Parameters["@MENSAJE"].Value.ToString();
                        tipoMensaje = oCmd.Parameters["@TIPOMENSAJE"].Value.ToString();
                        return objeto;
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }


        public citaBE cancelarCita(citaBE objeto, ref string mensajeRespuesta, ref string tipoMensaje)
        {
            try
            {
                using (SqlConnection oCn = new SqlConnection(this.cadenaConexion))
                {
                    using (SqlCommand oCmd = new SqlCommand("USP_CANCELAR_CITA", oCn))
                    {
                        oCmd.Parameters.Add("@CODCIT", SqlDbType.Int, 0).Value = objeto.CODCIT;
                        oCmd.Parameters.Add("@OBSCIT", SqlDbType.VarChar, 800).Value = objeto.OBSCIT;

                        oCmd.Parameters.Add("@MENSAJE", SqlDbType.VarChar, 200).Direction = ParameterDirection.Output;
                        oCmd.Parameters.Add("@TIPOMENSAJE", SqlDbType.VarChar, 1).Direction = ParameterDirection.Output;
                        oCmd.CommandType = CommandType.StoredProcedure;
                        oCmd.Connection = oCn;
                        oCn.Open();
                        oCmd.ExecuteNonQuery();
                        mensajeRespuesta = oCmd.Parameters["@MENSAJE"].Value.ToString();
                        tipoMensaje = oCmd.Parameters["@TIPOMENSAJE"].Value.ToString();
                        return objeto;
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }


        public List<citaBE> datosHistorialUsuario(citaBE objeto)
        {
            try
            {
                List<citaBE> lista = new List<citaBE>();
                citaBE cita;
                using (SqlConnection oCn = new SqlConnection(this.cadenaConexion))
                {
                    using (SqlCommand oCmd = new SqlCommand("USP_BUSCAR_HISTORIAL", oCn))
                    {
                        oCmd.Parameters.Add("@DNIPAC", SqlDbType.VarChar, 20).Value = objeto.DNIPAC;
                        oCmd.Parameters.Add("@NOMPAC", SqlDbType.VarChar, 2).Value = objeto.NOMPAC;
                        oCmd.CommandType = CommandType.StoredProcedure;
                        oCmd.Connection = oCn;
                        oCn.Open();
                        SqlDataReader reader = oCmd.ExecuteReader();
                        if (reader.HasRows)
                        {

                            while (reader.Read())
                            {
                                cita = new citaBE();
                                cita.CODCIT = reader.GetInt32(reader.GetOrdinal("CODCIT"));
                                cita.NOMPAC = reader.GetString(reader.GetOrdinal("NOMPAC"));
                                cita.APEPPAC = reader.GetString(reader.GetOrdinal("APEPPAC"));
                                cita.APEMPAC = reader.GetString(reader.GetOrdinal("APEMPAC"));
                                cita.DNIPAC = reader.GetString(reader.GetOrdinal("DNIPAC"));
                                cita.TELCPAC = reader.GetString(reader.GetOrdinal("TELCPAC"));
                                cita.TELHPAC = reader.GetString(reader.GetOrdinal("TELHPAC"));
                                cita.CORPAC = reader.GetString(reader.GetOrdinal("CORPAC"));
                                cita.DIRPAC = reader.GetString(reader.GetOrdinal("DIRPAC"));
                                cita.SEXPAC = reader.GetString(reader.GetOrdinal("SEXPAC"));
                                cita.FECCITA = reader.GetString(reader.GetOrdinal("FECCITA"));
                                cita.NUMDOCPAG = reader.GetString(reader.GetOrdinal("NUMDOCPAG"));
                                cita.TIPPAG = reader.GetString(reader.GetOrdinal("TIPPAG"));
                                cita.DESHOR = reader.GetString(reader.GetOrdinal("DESHOR"));
                                cita.NOMEMP = reader.GetString(reader.GetOrdinal("NOMEMP"));
                                cita.NOMOCU = reader.GetString(reader.GetOrdinal("NOMOCU"));
                                cita.OBSCIT = reader.GetString(reader.GetOrdinal("OBSCIT"));
                                cita.OBSATEN = reader.GetString(reader.GetOrdinal("OBSATEN"));
                                cita.NOMDOC = reader.GetString(reader.GetOrdinal("NOMDOC"));
                                cita.DESLAB = reader.GetString(reader.GetOrdinal("DESLAB"));   
                                lista.Add(cita);
                            }
                            return lista;
                        }
                        else
                        {
                            return null;
                        }
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }

        public void restaurarCita(string CODCIT)
        {
            using (SqlConnection oCn = new SqlConnection(this.cadenaConexion))
            {
                using (SqlCommand oCmd = new SqlCommand("USP_RESTAURAR_CITA", oCn))
                {
                    oCmd.Parameters.Add("@CODCIT", SqlDbType.VarChar, 20).Value = CODCIT;
                    oCmd.CommandType = CommandType.StoredProcedure;
                    oCmd.Connection = oCn;
                    oCn.Open();
                    oCmd.ExecuteNonQuery();
                }
            }
        }
    }
}
